import { Toast } from "antd-mobile";

type ResData<T = null> = {
  cnmsg: string;
  code: number;
  data: T;
  enmsg: string;
};

const handleError = (err: Error) => {
  const message = err.message;

  return Promise.reject({
    cnmsg: message,
    code: -1,
    data: null,
    enmsg: message,
  });
};

const codeMessage = {
  200: "服务器成功返回请求的数据。",
  201: "新建或修改数据成功。",
  202: "一个请求已经进入后台排队（异步任务）。",
  204: "删除数据成功。",
  400: "发出的请求有错误，服务器没有进行新建或修改数据的操作。",
  401: "用户没有权限（令牌、用户名、密码错误）。",
  403: "用户得到授权，但是访问是被禁止的。",
  404: "发出的请求针对的是不存在的记录，服务器没有进行操作。",
  406: "请求的格式不可得。",
  410: "请求的资源被永久删除，且不会再得到的。",
  422: "当创建一个对象时，发生一个验证错误。",
  500: "服务器发生错误，请检查服务器。",
  502: "网关错误。",
  503: "服务不可用，服务器暂时过载或维护。",
  504: "网关超时。",
};

const checkoutCode = (res: Response) => {
  // 当前为返回对象的处理。
  console.log(res);
  if (res.status === 200) {
    return res.json();
  }

  const errorText: string = codeMessage[res?.status] ?? "网络异常";

  const errData = handleError(new Error(errorText));
  Toast.show({
    icon: "fail",
    content: errorText,
  });

  return Promise.reject(errData);
};

const post = <T>(url: string, params?: object) => {
  const body = JSON.stringify({
    data: params,
  });

  return fetch(url, {
    method: "POST",
    mode: "same-origin",
    credentials: "include",
    body,
  })
    .catch((err) => handleError(err))
    .then(checkoutCode)
    .then((res: ResData<T>) => {
      if (res?.code === 200 && res.enmsg === "ok") {
        return res.data;
      }

      console.log(res);

      return Promise.reject(res.data);
    });
};

export { post };
